var cheerio = require('cheerio');
var fs = require('fs');
var lib = require('../../lib/index.js');
var config = require('./config.json');

var ALL_CATEGORY_LIST_DATA;//所有分类商家列表

// 1.创建数据链接
var connection = lib.connection();
connection.on('error', function(err) {
    console.log('db error', err);
    if (err.code === 'PROTOCOL_CONNECTION_LOST') {
        connection = lib.connection();
    } else {
        throw err;
    }
});
// 监听父进程消息
process.on('message', (msg) => {
  console.log(msg);
});

// 2.主程序
async function application() {
    console.log('加载主程序');
    // 获取ip
    // var result = await lib.myRequest('http://dps.kdlapi.com/api/getdps/?orderid=999581297060957&num=40&pt=1&dedup=1&format=json&sep=1').catch(function (e) {
    //     console.log('请求Ip出错');
    //     endProgram();
    //     return false;
    // });
    // config.proxy.ips = result.data.proxy_list;
    //
    // var ip = result.data.proxy_list[0].split(':');
    // config.proxy.host = ip[0];
    // config.proxy.port = ip[1];
    // console.log('获取ip成功:');
    // console.log(config.proxy);

    // return false;
    fs.readFile('../../1688/data/links.json', 'utf8', function(err,data) {
        ALL_CATEGORY_LIST_DATA = JSON.parse(data);//5262

        lib.eventEmitter.emit('do_spider','init');
    });
}
application();

// 3.获取新的分类商家列表url
lib.eventListener.on('do_spider', function(data) {
    config.tableName = '1688_supplys'+config.listNum;
    lib.creditSupplyTable(connection,config.tableName);

    var tempUrl = ALL_CATEGORY_LIST_DATA[config.listNum];
    var findChart = tempUrl.indexOf('sid');
    // console.log(tempUrl);
    // console.log(findChart);
    var cid = tempUrl.slice(findChart+3,tempUrl.length);
    // console.log(cid);
    listUrl = 'https://www.alibaba.com/catalogs/corporations/'+ cid +'/';

    console.log('分类'+config.listNum+'开始采集');
    getList();

    // if(data == 'init'){
    //     // 登录
    //     login(nightmare,nightmareList);
    // }else{
    //     nightmareList();
    // }
});

function endProgram() {
    console.log('中止程序,准备重启');

    fs.writeFile('./config.json', JSON.stringify(config), function(err) {
        if (err) {
            console.log(err);
        }else{
            console.log('中止程序前配置文件保存成功');
            connection.end();
            process.exit(0);//主动中止程序
        }
    });
}

// 4.列表
async function getList() {
    var url = listUrl+config.page;
    // var url = 'http://alibaba.com/catalogs/corporations/201746001/1';
    console.log('');
    console.log('1.列表url:'+url);

    var result = await lib.myRequest(url,{proxy:config.proxy}).catch(function (err) {
        console.log('list request err');
        console.log(err);
        // endProgram();
    });
    if(!result){
        endProgram();
        return false;
    }
    var $ = cheerio.load(result);

    var is_none_page = $('.tip-title').text().trim();
    // 无用的列表页
    if(is_none_page && is_none_page.indexOf('not match any products')>-1){
        console.log('无用的列表页');
        config.listNum++;
        config.page=1;
        endProgram();
        return false;
    }

    var maxPage = parseInt($('.m-pagination .next').prev().text());
    if(isNaN(maxPage)){
        console.log('maxPage为空，页面被屏蔽');
        endProgram();
        return false;
    }
    console.log('2.当前分类最大页数:'+maxPage+' 当前时间:'+lib.getTime());
    // console.log(maxPage);
    // return false;

    // 所在目录
    var fullCategory = [];
    $('.ui-breadcrumb a').each(function () {
        fullCategory.push($(this).text());
    });

    var promiseArr = [];
    console.log('3.本页最大数量:'+$('.m-item').length);
    console.log('4.当前分类:'+config.listNum);
    $('.m-item').each(function (index) {
        var supplyName = $(this).find('.title a').text().trim();
        var href = $(this).find('.title a').attr('href').replace('http','https');
        var connectUrl = $(this).find('.company .cd').attr('href').replace('http','https');

        // 重写url
        var start = href.indexOf('/member');
        var end = href.indexOf('/company_profile');
        var errUrl = false;
        if(start>0 && end>0){
            var tempUrl = href.substring(start+8,end);
            // console.log(tempUrl);
            // 有些链接无法获取
            if(tempUrl){
                href = 'https://'+tempUrl+'.fm.alibaba.com/company_profile.html#top-nav-bar'
                connectUrl = 'https://'+tempUrl+'.fm.alibaba.com/contactinfo.html'
            }else{
                // console.log(index);
                // console.log(href);
                errUrl = true;
            }
        }

        // if(index == 0){
            if(!errUrl){
                var promiseFun = new Promise((resolve, reject) => {
                    // var params = {
                    //     index:index,
                    //     fullCategory:fullCategory.join('>'),
                    //     supplyName:supplyName,
                    //     href:href,
                    //     connectUrl:connectUrl,
                    // };
                    // getDetail(params,resolve,reject);
                    setTimeout(function () {
                        // var ip = config.proxy.ips[(index+1)].split(':');
                        var params = {
                            index:index,
                            fullCategory:fullCategory.join('>'),
                            supplyName:supplyName,
                            href:href,
                            connectUrl:connectUrl,
                            requestConfig:{
                                // proxy:{
                                //     host:ip[0],
                                //     port:ip[1],
                                // },
                                headers: {
                                    "User-Agent": lib.userAgents[index%(lib.userAgents.length)],
                                    'Content-Type': 'application/x-www-form-urlencoded'
                                },
                            }
                        };
                        getDetail(params,resolve,reject);
                    }, 200*index);
                });
                promiseArr.push(promiseFun);
            }
        // }
    });

    // console.log(promiseArr.length);
    // return false;
    Promise.all(promiseArr).then((values) => {
        // console.log(values);
        // console.log('');
        // lib.insertData(connection,config.tableName,insertData);

        var isRestart = [];//是否重启
        for(var i=0;i<values.length;i++){
            var item = values[i];
            console.log(item.text);
            if(item.code == 1){
                isRestart.push(true);
            }
        }
        // 重启
        if(isRestart.length > values.length/2){
            console.log('出错信息太多，更换ip继续');
            endProgram();
            return false;
        }
        for(var i=0;i<values.length;i++){
            var item = values[i];
            if(item.data){
                lib.insertData(connection,config.tableName,item.data);
            }
        }

        config.page++;

        if(config.page > maxPage){
            console.log('类目'+config.listNum+'采集 end');
            console.log('');
            console.log('');
            console.log('');

            config.listNum++;
            if(config.listNum>config.endListNum){
                console.log('配置区间采集已结束');
            }else{
                config.page=1;
                lib.eventEmitter.emit('do_spider');
            }
        }else{
            // setTimeout(function () {
            //     getList();
            // }, 1000);
            getList();
        }
    }).catch((e)=>{
        console.log('promise.all Err');
        console.log(e);
    });
}
// 5.内容
async function getDetail(obj,resolve,reject) {
    var product_url;
    var connect_url;

    try {
        var result = await lib.myRequest(obj.href,obj.requestConfig).catch(function(error) {
            // console.log(error);
        });
        if(!result) {
            resolve({
                code:1,
                text:'数据'+obj.index+' 1.无详情页返回值,终止插入',
            });
            return false
        };
        var $ = cheerio.load(result);
        // console.log('');
        // console.log(obj.href + ' ' + obj.index);
        // console.log('请求内容url'+obj.index+'成功');
        // console.log('');

        var supply = {};
        supply.supplyName = obj.supplyName;

        // 检测页面是否被屏蔽
        var Ouch = $('.error-copy h1').text();
        if(Ouch == 'Ouch...'){
            console.log('页面被屏蔽，错误1');
            endProgram();
            return false;
        }

        var data = decodeURIComponent($('[module-title=cpCompanyOverview]').attr('module-data'));

        // 失败方式1
        if(data == 'undefined'){
            // console.log('失败' + obj.href + ' ' + obj.index);
            // console.log('');
            resolve({
                code:1,
                text:'数据'+obj.index+' 2.无法获取公司图片、概览等一系列信息影响后续,终止插入',
            });
            return false;
        }
        var d = JSON.parse(data);
        // console.log(d.mds.moduleData);
        // fs.writeFile('./d.json', JSON.stringify(d), function(err) {
        //     if (err) console.log(err);
        //     else console.log('写文件操作成功');
        // });

        // 0.公司图片
        supply.imgs = [];
        if(d.mds.moduleData.data.companyAboutUsImg && d.mds.moduleData.data.companyAboutUsImg.value){
            supply.imgs = d.mds.moduleData.data.companyAboutUsImg.value;
        }
        // 1.概览数据
        supply.baseInfo = {};
        for(var i in d.mds.moduleData.data){
            var item = d.mds.moduleData.data[i];
            if(item.title){
                if(typeof(item.value) == 'object'){
                    supply.baseInfo[item.title] = JSON.stringify(item.value);
                }else{
                    supply.baseInfo[item.title] = item.value;
                }
            }
        }
        // console.log(supply.baseInfo);

        // 2.otherContent
        supply.otherContent = {};
        $('.mod-content .content .icbu-shop-table-col-item').each(function () {
            var key = $(this).find('.title').text().trim();
            var value = $(this).find('.content').text().trim();
            supply.otherContent[key] = value;
        });
        // console.log(supply.otherContent);

        // 请求产品数据前置条件
        var moduleIds = $('[module-title=selectedProducts]').attr('module-id') || $('[module-title=cpProduct]').attr('module-id');
        var script = $('head script').last().html();
        var host = script.replace('window.pageConfig=','');
        host = JSON.parse(lib.ext_json_decode(host));
        // 3.请求产品
        // return false;
        var product_params = {
            bizId: d.gdc.bizId,
            language: 'en_US',
            envMode: 'product',
            // hostToken: 'V1Ih5XX8Au5PumWUxR6RkTlPraBchKNYD0F065o3shUecbAkv5MuAFJW1A8NIjvCcdx7ThJAuzNaQrDHennK5R9A==',
            hostToken: host.token||host.host_token,
            siteId: d.gdc.siteId,
            pageId: d.gdc.pageId,
            renderType: 'module',
            moduleIds: moduleIds,
        };
        product_url = 'https://'+d.mds.moduleData.data.esiteSubDomain.value + '/event/app/alisite/render.htm';
        // console.log(product_url);
        // console.log(product_params);
        var result1 = await lib.myRequest(product_url,{
            method:'post',
            data:product_params,
            proxy:obj.requestConfig.proxy,
            headers:obj.requestConfig.headers,
        }).catch(function(error) {
            // console.log(error);
        });

        supply.products_list = [];
        if(result1 && result1.data){
            var products = JSON.parse(result1.data[moduleIds].data);
            for(var i=0;i<products.data.productList.length;i++){
                var item = products.data.productList[i];
                supply.products_list.push(item.url);
            }
            // console.log(products.urls);
        }else{
            // console.log('数据'+obj.index+' 1.无法获取产品链接');
        }

        // 4.联系信息
        var result2 = await lib.myRequest(obj.connectUrl,obj.requestConfig).catch(function(error) {
            // console.log(error);
        });
        if(!result2){
            resolve({
                code:1,
                text:'第'+obj.index + '条,联系信息页面无返回内容,终止插入'
            });
            return false
        };
        var $2 = cheerio.load(result2);
        var contact = decodeURIComponent($2('[module-title=contactPerson]').attr('module-data'));
        // 失败方式2
        if(contact == 'undefined'){
            resolve({
                code:1,
                text:'第'+obj.index + '条读取联系页信息data,终止插入'
            });
            return false;
        }

        var contact_info = JSON.parse(contact).mds.moduleData.data;
        // console.log(contact_info.encryptAccountId)
        // contact_info.encryptAccountId = 'IDX1EZOGuw25yMLPsFUtbTZjz7iWOenP4RfxaWdtXtQ_czV6wgrhMd-vgLg_y9jFPggy'
        // 登录获取联系信息
        connect_url = 'https://'+d.mds.moduleData.data.esiteSubDomain.value+'/event/app/contactPerson/showContactInfo.htm?encryptAccountId='+contact_info.encryptAccountId;
        // console.log(connect_url);
        var result3 = await lib.myRequest(connect_url,obj.requestConfig).catch(function(error) {
            // console.log(error);
        });
        if(!result3) {
            resolve({
                code:1,
                text:'第'+obj.index + '条无联系信息,终止插入'
            });
            return false;
        };
        // console.log(result3);
        // return false;

        var insertData = {
            fullCategory:obj.fullCategory,
            companyName:supply.supplyName,
            imgs:supply.imgs.toString(),
            productsUrl:supply.products_list.toString(),
            baseInfo:JSON.stringify(supply.baseInfo),
            otherContent:JSON.stringify(supply.otherContent),
            connectInfo:JSON.stringify(result3.contactInfo),
        };
        // console.log(insertData);
        // return false;
        // lib.insertData(connection,config.tableName,insertData);
        // resolve('数据'+obj.index+' ok');
        resolve({
            code:100,
            text:'数据'+obj.index+' ok',
            data:insertData
        });

        // console.log(d1);
        // fs.writeFile('./d1.json', JSON.stringify(d1), function(err) {
        //     if (err) console.log(err);
        //     else console.log('写文件操作成功');
        // });
    } catch (e) {
        console.log('detail:try catch '+obj.index);
        console.log(obj.href);
        console.log(product_url);
        console.log(obj.connectUrl);
        console.log(connect_url);
        console.log(e);
        console.log('detail:try catch end');
        endProgram();
        return false;
    }
}
